import axios from 'axios'
import router from '../router'
import store from '../store'
import { Message } from 'element-ui'
import qs from 'qs'
// 创建axios实例
const request = axios.create({})
// 根据请求url获取接口请求地址
function getBaseUrl (url) {
  if (url.startsWith('/boss')) {
    return 'http://eduboss.lagou.com'
  } else {
    return 'http://edufront.lagou.com'
  }
}
// 跳转登录页
function redirectLogin () {
  router.push({
    name: 'login',
    query: {
      redirect: router.currentRoute.fullPath
    }
  })
}
// 请求拦截
request.interceptors.request.use(
  config => {
    config.baseURL = getBaseUrl(config.url)
    const { user } = store.state
    if (user?.access_token) {
      config.headers.Authorization = user.access_token
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 用户认证信息正在刷新的标识
var isRefreshing = false
// 存储因刷新用户认证信息时而请求失败的请求，以便重新发送
var requests = []
// 响应拦截
request.interceptors.response.use(
  response => {
    return response
  },
  error => {
    if (error.response) {
      // 获取请求失败状态码
      const { status } = error.response
      let errorMessage = ''
      if (status === 400) {
        errorMessage = '请求参数错误'
      } else if (status === 401) {
        // 检测是否有用户信息
        // 无用户信息，跳转登录页
        if ([null, undefined, ''].includes(store.state.user)) {
          redirectLogin()
          return Promise.reject(error)
        }
        // 检测是否正在刷新token
        if (isRefreshing) {
          // 存储失败请求
          return requests.push(() => {
            // 在error.config中获取本次错误请求配置
            request(error.config)
          })
        }
        // 刷新token请求前将刷新标记置为true
        isRefreshing = true
        request({
          method: 'POST',
          url: '/front/user/refresh_token',
          data: qs.stringify({
            refreshtoken: store.state.user.refresh_token
          })
        })
          .then(res => {
            // token刷新失败
            if (res.data.state !== 1) {
              // 跳转登录
              redirectLogin()
              // 用户信息清空
              store.commit('setUser', null)
              return Promise.reject(error)
            }
            // token刷新成功
            // 存储刷新的用户信息
            store.commit('setUser', res.data.content)
            // 将存储的失败请求全部发送
            requests.forEach(callback => callback())
            // 发送完毕后清空失败请求存储数组
            requests = []
            // 将本次发送失败的请求发送出去
            return request(error.config)
          })
          .catch(err => {
            // 将错误返回
            return Promise.reject(err)
          })
          .finally(() => {
            // 刷新token请求完成标记置为false
            isRefreshing = false
          })
      } else if (status === 403) {
        errorMessage = '没有权限，请联系管理员'
      } else if (status === 404) {
        errorMessage = '页面找不到了！'
      } else if (status >= 500) {
        errorMessage = '服务器出错了，请联系管理员'
      } else {
        errorMessage = '未知错误'
      }
      Message.error(errorMessage)
    } else if (error.request) {
      Message.error('请求超时了')
    } else {
      // 意料之外的错误
      Message.error(error.message)
    }
    // 抛出错误给下一步函数处理
    return Promise.reject(error)
  }
)
export default request
